home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BBS Toolkit
/
BBS Toolkit.iso
/
maximus
/
mxms_161.zip
/
MAXHEAD.ZIP
/
MAX.H
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-28
|
66KB
|
1,399 lines
/***************************************************************************
* *
* MAXIMUS-CBCS Source Code, Version 1.02 *
* Copyright 1989, 1990 by Scott J. Dudley. All rights reserved. *
* *
* Main Maximus header file *
* *
* For complete details of the licensing restrictions, please refer to *
* the licence agreement, which is published in its entirety in MAX.C *
* and LICENCE.MAX. *
* *
* USE OF THIS FILE IS SUBJECT TO THE RESTRICTIONS CONTAINED IN THE *
* MAXIMUS-CBCS LICENSING AGREEMENT. IF YOU DO NOT FIND THE TEXT OF THIS *
* AGREEMENT IN ANY OF THE AFOREMENTIONED FILES, OR IF YOU DO NOT HAVE *
* THESE FILES, YOU SHOULD IMMEDIATELY CONTACT THE AUTHOR AT ONE OF THE *
* ADDRESSES LISTED BELOW. IN NO EVENT SHOULD YOU PROCEED TO USE THIS *
* FILE WITHOUT HAVING ACCEPTED THE TERMS OF THE MAXIMUS-CBCS LICENSING *
* AGREEMENT, OR SUCH OTHER AGREEMENT AS YOU ARE ABLE TO REACH WITH THE *
* AUTHOR. *
* *
* You can contact the author at one of the address listed below: *
* *
* Scott Dudley FidoNet 1:249/106 *
* 777 Downing St. IMEXnet 89:483/202 *
* Kingston, Ont. Internet f106.n249.z1.fidonet.org *
* Canada - K7M 5N3 BBS (613) 389-8315 - HST/14.4K, 24hrs *
* *
***************************************************************************/
#ifndef _MAX_H_DEFINED
#define _MAX_H_DEFINED
#define realpriv() (locked2 ? lockpriv2 : usr.priv)
/***************************************************************************
Initialization of variables
***************************************************************************/
#ifdef NOVARS
#ifndef NOINIT
#define INITIALIZE
#endif
#endif
#ifdef INITIALIZE
#define extrn
#define IS(x) =x
#define LEN(x) x
#else
#define extrn extern
#define IS(x)
#define LEN(x)
#endif
/***************************************************************************
Conditional flags for the entire program, and portability stuff
***************************************************************************/
#include <time.h>
/* #define DMALLOC */ /* Signifies that we want debugging malloc() *
* calls turned on... */
/* #define TEST_VER */ /* Says we're not compiling a release version. *
* Includes stuff such as forced log-file *
* flushing, and others which are helpful for *
* debugging... */
#define FLUSH_LOG /* Tells Maximus to flush the log file after *
* each transaction. */
#define INTERNAL_PROTOCOLS /* Means we use internal file-xfer routines, *
* rather than shelling out to DSZ and CLINK! *
* Note that you can only DOWNLOAD using this *
* option: External DSZ/CLINK uploads are *
* not supported, unless you go through the *
* standard external protocol interface. */
#define SHORT_MDM_CMD /* Use the abbreviated version of mdm_cmd(). */
/* If we're using TC, then turn off the following two warnings... They *
* are mainly just an annoyance, especially when working with someone *
* else's structures or code. All of the other warnings should be on. */
#ifdef __TURBOC__
#pragma warn -ucp /* Turn off unsigned/signed char pointer mixup warnings */
#pragma warn -stu /* Turn off undefined structure warnings */
#endif
/***************************************************************************
#undefine's, to handle some crap in other people's header files
***************************************************************************/
#ifdef PATHLEN
#undef PATHLEN
#endif
#ifdef BLINK
#undef BLINK
#endif
#ifdef DLE
#undef DLE
#endif
#ifdef lputs
#undef lputs
#endif
#ifdef TIMEOUT
#undef TIMEOUT
#endif
/***************************************************************************
Miscellanious Macros
***************************************************************************/
#define Mdm_keyp() (Mdm_kpeek() != -1)
#define Clear_KBuffer() *linebuf='\0'
#define Save_Directory(path) Save_Dir(&orig_disk,orig_path,path)
#define Restore_Directories() Restore_Dir(&orig_disk,orig_path)
#define Save_Directory2(path) Save_Dir(&orig_disk2,orig_path2,path)
#define Restore_Directories2() Restore_Dir(&orig_disk2,orig_path2)
#define Save_Directory3(path) Save_Dir(&orig_disk3,orig_path3,path)
#define Restore_Directories3() Restore_Dir(&orig_disk3,orig_path3)
#define Yes_or_No(expr) ((expr) ? yes : no)
/* The next macro determines if character `c' is an uppercase character
or a space. There is a quickie way to do it with Turbo C, so we'll
automatically use that if we're using the right compiler. */
#ifdef __TURBOC__
#define isupsp(c) (_ctype[(c) + 1] & (_IS_UPP | _IS_SP))
#else
#define isupsp(c) (isupper(c) || isspace(c))
#endif
/* The following are translations for the local keyboard services. You
might want to change them to something else on a different architechture,
depending on what works. */
#define kbhit() (fossil_peek() != -1)
#define pgetch() fossil_getcw() /* Get char. from local console function */
/* The following are shorthand macros for calling the Input(), wInput_Char(),
and GetListAnswer() functions:
The uses for the functions are as follows:
OpusGets - Get a word from the user, no special features.
OpusGetsC - Get a word from the user, having the C)haracter `c' already
been entered.
OpusGetse - Get a word from the user, E)choing the character `e' for
every character the user types.
OpusGetsL - Get a L)ine from the user, not utilizing linebuf, and with
a maximum of `m' characters entered.
OpusGetsNH - Same as OpusGetsL, but no moving to the top line if
HOTFLASH is on.
OpusGetsLe - Same as OpusGetsL, but echoes the character `e'.
OpusGetsLL - Get a L)ine from the user, but we DO utilize L)inebuf.
KeyGet - Gets a character, displaying it both in HOTFLASH and
normal uses, and storing the answer in lastmenu. The
character must be in the string `a'.
KeyGetN - Same as KeyGet(), provided for compatibility
KeyGetR - Gets a character, displaying it in both help
modes (HOTFLASH/normal), and returning the value through
a return() call.
KeyGetRP - Same as KeyGetR, but displaying the prompt `p' beforehand.
KeyGetRN - Gets a character, NOT displaying it if we're in HOTFLASH
mode (but will display it in normal), returning the
character via return(), and displaying no prompt.
KeyGetRNP - Displaying the prompt `p' beforehand, gets a character,
NOT displaying it in HOTFLASH, and zooming up to the top
line of the screen (and back) for HOTFLASH entry, if the
user has that mode selected. (Otherwise, we stay put.)
*/
#define OpusGets(d,p) Input(d,INPUT_word,0,0,p)
#define OpusGetsM(d,m,p) Input(d,INPUT_word,0,m,p)
#define OpusGetsWNH(d,p) Input(d,INPUT_word | INPUT_nohotflash,0,0,p)
#define OpusGetse(d,e,p) Input(d,INPUT_word | INPUT_echo,e,0,p)
#define OpusGetseNH(d,e,p) Input(d,INPUT_word | INPUT_echo | INPUT_nohotflash,e,0,p)
#define OpusGetsC(d,c,p) Input(d,INPUT_word | INPUT_alreadych,c,0,p)
#define OpusGetsL(d,m,p) Input(d,INPUT_nlb_line,0,m,p)
#define OpusGetsNH(d,m,p) Input(d,INPUT_nlb_line | INPUT_nohotflash,0,m,p)
#define OpusGetsLe(d,m,e,p) Input(d,INPUT_nlb_line | INPUT_echo,e,m,p)
#define OpusGetsLL(d,m,p) Input(d,INPUT_lb_line,0,m,p)
#define mdm_getsp(d,m) Input(d,INPUT_msgenter | INPUT_nlb_line | INPUT_nohotflash,0,m,NULL)
#define KeyGetRNP(p) Input_Char(CINPUT_display | CINPUT_prompt | CINPUT_hotflash | CINPUT_noxlt,p)
#define GetYnAnswer(p,t) GetListAnswer(Yn,NULL,useyforyes,t,p)
#define GetyNAnswer(p,t) GetListAnswer(yN,NULL,useyforyes,t,p)
#define GetYnnsAnswer(p,t) GetListAnswer(Yne,NULL,useyforyesns,t,p)
#define GetYnhAnswer(h,p,t) GetListAnswer(Ynq,h,useyforyes,t,p)
#define GetyNhAnswer(h,p,t) GetListAnswer(yNq,h,useyforyes,t,p)
/* Priv level definitions */
#define priv_twit (_privs[0].name)
#define priv_disgrace (_privs[1].name)
#define priv_limited (_privs[2].name)
#define priv_normal (_privs[3].name)
#define priv_worthy (_privs[4].name)
#define priv_privil (_privs[5].name)
#define priv_privel (_privs[5].name)
#define priv_favored (_privs[7].name)
#define priv_extra (_privs[8].name)
#define priv_clerk (_privs[9].name)
#define priv_asstsysop (_privs[10].name)
#define priv_sysop (_privs[11].name)
#define priv_hidden (_privs[12].name)
/* Macros for the lock/key system. UserHasKey() determines if a user
is carrying key `k', UserKeyOff(k) takes key `k' away from the user
(if he had it in the first place), and UserKeyOn(k) gives key `k' to
the user. AreaHasLock() determines if the area `a' (a _sys structure)
is locked with lock `l'. */
#define UserHasKey(k) (usr.key & (1 << (k)))
#define UserKeyOff(k) (usr.key &= ~(1 << (k)))
#define UserKeyOn(k) (usr.key |= (1 << (k)))
#define MsgAreaHasLock(a,l) ((a).msglock & (1 << (l)))
#define FileAreaHasLock(a,l) ((a).filelock & (1 << (l)))
#define GEPriv(p1,p2) ((signed int)(p1) >= (signed int)(p2))
#define LEPriv(p1,p2) ((signed int)(p1) <= (signed int)(p2))
/* Macros for finding out the user's current time status. timeleft is
the time (in minutes) that the user has left on the system. timeonline
is the length (in minutes) that the current user has been on-line. */
/*
#define timeleft (((__temptime=time(NULL)) > timeoff) ? (-1) : ((int)(((signed long)timeoff-(signed long)__temptime)/60L)+1))
#define timeonline ((int)((time(NULL)-(signed long)timeon)/60L))
*/
/* Figures out the user's graphics state, and puts it in one, single
variable. Kludgery to get around the original Opus bitfields. */
#define graph (usr.ansi ? GRAPHICS_ansi : (usr.avatar ? GRAPHICS_avatar : 0))
/* A macro for Goto(), and local screen display function pointers: */
#define Goto(xx,yy) Printf(goto_str,(char)(xx),(char)(yy))
#define lputc(c) (*local_putc)(c)
#define lputs(s) (*local_puts)(s)
/* To see if a character is an alphanumeric or punctuation... */
#define isalnumpunct(ch) (! is_wd(ch))
/***************************************************************************
Constant #define's
***************************************************************************/
#define STATUS_normal 0x00
#define STATUS_remove 0x01
#define STATUS_force 0x02
#define IREADLEN 60
#define MAXED_SAVE_MEM 4000L /* How much mem to save while in MaxEd */
#define BORED_SAVE_MEM 4000L /* How much mem to save in BORED */
#define MAXLEN 85 /* size of primary line-input buffer */
#define NORM_SCAN_TIME 15L
#define CHAT_SCAN_TIME 1L
#define CMSG_page 0x00
#define CMSG_enq 0x01
#define CMSG_ack 0x02
#define CMSG_eot 0x03
#define CMSG_cdata 0x04
#define MAX_TASK 256 /* Maximus number of tasks */
#define MAX_TRIES 20 /* # of times to retry IPCxx.BBS operation */
#define MAX_OVR 16 /* Maximum # of override privs per area */
#define AREA_SIGNATURE ((unsigned char)'\xf5') /* Signature for area.id */
#define MAX_MENUNAME PATHLEN /* Max. length of menuname[]. */
#define MAX_QUOTEBUF 50 /* Maximum number of quote windows to page */
#define COPY_SIZE 16384 /* Default buffer size for copy_file() */
#define RST_VER 3 /* Version number of RESTARxx.BBS */
#define MAX_AREAS 1296 /* Maximum number of total areas -- This # *
* can't be changed, but it is handy to *
* have a def. for internal calculations. *
* 1296==(26+10)^2, since each of the *
* two digits of the area number can be *
* 0-9 or A-Z. */
#define NUM_AIDX 80 /* Number of AREAS.IDX entries at once */
#define NUM_NDI 160 /* Number of nodelist entries to read in */
#define USR_SEARCH 32 /* Number of users to read in at a time */
#define MAX_LINE 255 /* Max. length of a .CTL file line! */
#define SCAN_BLOCK 10 /* # of msgs to read in from scanfile at *
* once */
#define MAX_MSGDISPLAY 26 /* Max # of lines that Msg_Display() will *
* req. from Msg_Read_Lines at once. */
#define MAX_MSGLINES 256 /* Max # of lines you can req. from *
* Msg_Read_Lines at once. */
#define MAX_MSGWIDTH 129 /* Max. width of each message line */
#define MAX_PRINTF 256 /* Max. number of output ...printf() chars */
#define SEEK_SIZE 64 /* # of bytes of ZIPfile to search for *
* header in at a time. This MUST not *
* be higher than 64, 'bcuz we may get *
* into problems with NESTED ZIPfiles if *
* it is any larger. */
#define MAX_NEST 8 /* Max. number of .BBS files to nest. *
* We can go more, but we'd have to *
* increase the stack size quite a bit! */
#define MAX_BUSYLOOP 15 /* Max. number of times we should loop *
* waiting for a file to become un-busy */
#define FILEBUFSIZ 512 /* Size of display-file read-in buffer */
#define FWD_BUFSIZ 512 /* #ofbytes to copy at a time for msg. fwd */
#define FWD_OVERLAP 40 /* #ofbytes to overlap for msg. fwd */
#define CHANGE_SCREENLEN 85 /* # of #'s to print when testing user's *
* screen length. */
#define TIMEOUT 240 /* #of seconds for input timeout! (4 min.) */
#define RETIMEOUT 60 /* #of seconds until hangup after 1st *
* timeout warning (1 min.) */
#define MAX_EXECARGS 64 /* Max. number of parameters when invoking *
* an external program */
#define BMSGBUFLEN (MSGBUFLEN*3) /* Amount to allow for msgbuffer */
#define MSGBUFLEN 512 /* Max. num of characters of message to *
* hold at any one time. No less than 80 */
#define WORDBUFLEN 60 /* Length of wordwrap buffer */
#define DEFAULT_ATTR 3 /* Cyan on black */
/* #define NONSTOP 18*/ /* Code returned which means nonstop */
#define PATHLEN 120 /* MAXIMUM length of any path\filename.ext */
#define BUFLEN 80 /* Size of primary line input buffer */
#define PROMPTLEN 90 /* Max. length of any prompt */
/* With a 64K data seg, we only have enough room to hold 1500 msgs. */
#if defined(__NEARDATA__)
#define MAX_MSG 1500 /* Max. # of messages in one area */
#elif defined(__FARDATA__)
#define MAX_MSG 4000 /* Max. # of messages in one area */
#else
#error I don't know what model I'm in. (Include compiler.h maybe?)
#endif
#define DLE 16 /* DLE character used in BBS file display */
#define PREREGISTERED 0x7530 /* Priv. value that means let no new *
* callers on the system. */
/***************************************************************************
Bit Masks and Function Behaviour Controls
***************************************************************************/
#define DISPLAY_none 0x00 /* Nothing special for display */
#define DISPLAY_filesbbs 0x01 /* If displaying a FILES.BBS */
#define DISPLAY_newfiles 0x02 /* If only displaying new files */
#define DISPLAY_search 0x04 /* If we're searching FILES.BBS for text */
#define DISPLAY_areaname 0x08 /* If we display area name for each area */
#define DISPLAY_hotmenu 0x10 /* */
#define DISPLAY_pcall 0x20 /* Increment the #-of-callers count */
#define DISPLAY_menuhelp 0x40 /* If we should use menuhelp for usr.help */
#define STATUS_available 0x00 /* For Who_Is_On() */
#define STATUS_notavail 0x01
#define STATUS_filexfer 0x02
#define STATUS_msgenter 0x03
#define SCROLL_up 0x06 /* Modes for VioScroll() */
#define SCROLL_down 0x07
#define MSGLINE_normal 0x00 /* Type of line currently being displayed */
#define MSGLINE_seenby 0x01 /* in message... */
#define MSGLINE_kludge 0x02 /* */
#define MSGLINE_quote 0x04 /* */
#define MSGLINE_end 0x08 /* */
#define MSGLINE_soft 0x10 /* Soft C/R (wordwrapped) */
#define DIRECTION_previous 0x00 /* Direction of message reading */
#define DIRECTION_next 0x01 /* */
#define CTL_none 0x00 /* What type of .CTL to generate for */
#define CTL_normal 0x01 /* external programs. */
#define CTL_upload 0x02
#define CTL_download 0x03
#define OUTSIDE_errorlevel 0x01 /* Method to use for outside command! */
#define OUTSIDE_chain 0x02
#define OUTSIDE_run 0x03
#define OUTSIDE_dos 0x04
#define OUTSIDE_concur 0x05
#define OUTSIDE_reread 0x40 /* Re-read LASTUSxx.BBS after execution */
#define OUTSIDE_stay 0x80 /* Stay in current directory when going out! */
#define GRAPHICS_none 0x00 /* The current user's graphics setting... */
#define GRAPHICS_ansi 0x01 /* Use to compare with `graph'! */
#define GRAPHICS_avatar 0x02
#define LINE_restore 0x00 /* Tells TopLine() what to do */
#define LINE_top 0x01
#define MENU_msg 0x01 /* The currently-loaded menu is... */
#define MENU_file 0x02
#define MENU_other 0x03
#define ENTRY_false 0x00 /* If we're not entering current msg. area */
#define ENTRY_true 0x01 /* If we ARE just entering current area */
#define ENTRY_noheader 0x02 /* Equal to ENTRY_true, but we just don't *
* print anything when we re-scan. */
#define ENTRY_nocheck 0x03 /* Don't re-read area's info. */
#define ENTRY_nohdr 0x04 /* Same as noheader, but no display at all */
#define ENTRY_nohdre 0x05 /* Same as above, but enter area */
#define ENTRY_nochecke 0x06 /* Same as nocheck, but enter area */
#define ERROR_minfile 2 /* The different errorlevel exits we use */
#define ERROR_file 3 /* for various reasons. */
#define ERROR_nofossil 3
#define ERROR_param 3
#define ERROR_critical 3
#define ERROR_recycle 2
#define VIDEO_dos 0x00 /* Specifies type of local video, used for */
#define VIDEO_fossil 0x01 /* `displaymode'. */
#define VIDEO_ibm 0x02
#define VIDEO_fast 0x03 /* */
#define SKIP_none 0 /* For the ^Pxxx commands in .BBS files. */
#define SKIP_file 1
#define SKIP_line 2
#define ARCHIVE_arc 0x00 /* An .ARC */
#define ARCHIVE_lzh 0x01 /* A .LZH */
/* Definitions for the Input() function. Remember to use no more than ONE
of `INPUT_echo' or `INPUT_alreadych'! */
#define INPUT_lb_line 0x0001 /* Input a line, utilizing linebuf */
#define INPUT_nlb_line 0x0002 /* Input a line, NOT utilizing linebuf */
#define INPUT_word 0x0004 /* Input a word, utilizing linebuf */
#define INPUT_echo 0x0008 /* `ch' contains character to echo back. */
#define INPUT_alreadych 0x0010 /* `ch' contains a character that has *
* already been entered by the user. */
#define INPUT_nohotflash 0x0020 /* Don't go up to the top line of screen! */
#define INPUT_noctrlc 0x0040 /* Don't allow user to ^C to dump output *
* and redisplay prompt. */
#define INPUT_msgenter 0x0080 /* If we're currently entering message *
* header info, and the arrow keys are *
* allowed to do something... */
#define INPUT_nolf 0x0100 /* Don't send LF at end of input function */
#define INPUT_msgread 0x0200 /* Allow Prev/Next arrow keys */
#define INPUT_wordwrap 0x0400 /* Word-wrap this string */
/* Definitions for the Input_Char() function. Remember to use no more than
ONE of `CINPUT_acceptable' or `CINPUT_prompt'! */
#define CINPUT_display 0x0001 /* If we display the character entered, if *
* we're in hotkey mode. If we're not, we *
* *always* display the characters entered */
#define CINPUT_acceptable 0x0002 /* `extra' specifies a list that the *
* entered character must be one of. *
* Otherwise, we re-prompt and ask again. */
#define CINPUT_prompt 0x0004 /* Display the prompt `extra' before *
* trying to get the character. */
#define CINPUT_lastmenu 0x0008 /* If set, we set `lastmenu' to be the *
* character the user pressed. Otherwise, *
* we simply return() it. */
#define CINPUT_hotflash 0x0010 /* If we should go up to the top line (for *
* HOTFLASH), or just stay where we are) */
#define CINPUT_noxlt 0x0020 /* Don't translate special characters, *
* such as \r and \n, into their ASCII *
* equivilents. (ie. '\r'=='|') */
#define CINPUT_noctrlc 0x0040 /* Don't allow user to ^C to dump output *
* and redisplay prompt. */
#define CINPUT_p_ctrlc 0x0080 /* Only display prompt if user ^C's... */
#define CINPUT_nolf 0x0100 /* Don't display LF */
#define CINPUT_fullprompt 0x0200 /* The GetListAnswer() o_prompt parm does *
* include the choices */
#define CINPUT_allanswers 0x0400 /* If we need an answer or not */
#define CINPUT_dump 0x0800 /* DUMP output once we get a character */
#define CINPUT_msgread 0x1000 /* Arrow keys for msg.reading */
#define CINPUT_iread 0x2000
#define LAST_none 0x00 /* Used in SILT to control the status */
#define LAST_section 0x01 /* display. */
#define LAST_area 0x02
#define LAST_menu 0x03
#define RESTART_menu 0x00 /* If restarting at a menu */
#define RESTART_dotbbs 0x01 /* If restarting in middle of .BBS file */
#define NUM_MENU 256 /* Max. # of options in a menu file */
#define bit unsigned
#define sword signed int
#define word unsigned int
#define dword long int
#define byte unsigned char
/* Defines for *.MNU: */
#define AREATYPE_local 0x01 /* Tells which type (and which type ONLY) */
#define AREATYPE_matrix 0x02 /* that command can be used in. */
#define AREATYPE_echo 0x04
#define AREATYPE_all (AREATYPE_local | AREATYPE_matrix | AREATYPE_echo)
#define HEADER_none 0x00 /* The header type for each menu. */
#define HEADER_message 0x01
#define HEADER_file 0x02
#define HEADER_change 0x03
#define HEADER_chat 0x04
#define OFLAG_nodsp 0x0001 /* Don't display menu option on MENU, but */
/* accept it as a command. */
#define OFLAG_ctl 0x0002 /* Produce a .CTL file for this xtern cmd */
#define OFLAG_nocls 0x0004 /* Don't do a CLS for this display_menu */
#define OFLAG_then 0x0008 /* Do only if last IF equation was true */
#define OFLAG_else 0x0010 /* Do only if last IF equation was FALSE */
#define OFLAG_ulocal 0x0020 /* Only display for local users */
#define OFLAG_uremote 0x0040 /* Only display for remote useres */
#define OFLAG_reread 0x0080 /* Re-read LASTUSER.BBS upon re-entry */
/* A few colours to make things easier on ME, the programmer. These are *
* used all over the place, and made AVATAR commands a helluvalot easier *
* to deal with. Unfortunately, if you don't have an ANSI compiler, *
* you're pretty well out of luck! */
/* Standard colours: */
#define BLACK "\x16\x01\x00"
#define BLUE "\x16\x01\x01"
#define GREEN "\x16\x01\x02"
#define CYAN "\x16\x01\x03"
#define RED "\x16\x01\x04"
#define MAGENTA "\x16\x01\x05"
#define BROWN "\x16\x01\x06"
#define GRAY "\x16\x01\x07"
#define GREY "\x16\x01\x07"
#define LBLACK "\x16\x01\x08"
#define LBLUE "\x16\x01\x09"
#define LGREEN "\x16\x01\x0a"
#define LCYAN "\x16\x01\x0b"
#define LRED "\x16\x01\x0c"
#define LMAGENTA "\x16\x01\x0d"
#define YELLOW "\x16\x01\x0e"
#define WHITE "\x16\x01\x0f"
/* Special AVATAR sequences: */
#define BLINK "\x16\x02"
#define CLS "\x0c"
#define CLEOL "\x16\x07"
#define UP "\x16\x03"
#define DOWN "\x16\x04"
#define LEFT "\x16\x05"
#define RIGHT "\x16\x06"
/* Now some special colours that we use: */
#define BLKONWHIT "\x16\x01\x70"
#define REDONWHIT "\x16\x01\x74"
#define WHITONWHIT "\x16\x01\x77"
#define MAGONBLUE "\x16\x01\x1d"
#define WHITONBLUE "\x16\x01\x1f"
#define YELONBLUE "\x16\x01\x1e"
#define DKGRAYONWHIT "\x16\x01\x78"
#define CHATTR "\x16\x01%c"
/***************************************************************************
Definitions for MaxEd and Bored
***************************************************************************/
/* #define UPDATE_POSITION*/ /* Whether or not we want to have a *
* display in the lower-right hand corner *
* of the screen, telling the current *
* cursor position. (Default OFF, too *
* slow from remote!) */
#define SAVE 0x00 /* Return codes from the editor... */
#define ABORT 0x01
#define NOTHING 0x02
#define LOCAL_EDIT 0x03 /* Returned ONLY by Editor() func, passed *
* back through Local_Editor(). */
#define HARD_CR '\x0d'/* User pressed C/R here, insert into *
* the actual message. */
#define SOFT_CR '\x8d'/* Local wordwrap, don't bother storing *
* it in the messages. */
#define MODE_UPDATE 0 /* Update position after wordwrap */
#define MODE_NOUPDATE 1 /* Don't update position after wordwrap */
#define MODE_SCROLL 2 /* Update position, and scroll if *
* necessary! */
#define QUOTELINES 4 /* Number of lines to quote at a time */
#define MAX_LINES 100 /* Maximum number of lines in file */
#define MAX_LINELEN (LINELEN*2) /* Double the length of line which can *
* possibly be entered in editor. */
#define LINELEN 80 /* Max. length of line to use */
#define MAX_WRAPLEN 35 /* Length of largest word to wordwrap */
#define UPDATEBUF_LEN (MAX_LINES+26) /* # of update_table entries */
#define SCROLL_LINES (usrlen-4) /* Number of lines to scroll down or up */
/* used to be (usrlen/3)*2) */ /* for any given command which goes past*/
/* screen boundaries. */
#define SCROLL_CASUAL (usrlen >> 1) /* Half of screen for casual scroll */
/* Go left XX characters */
#define Cursor_LeftM(n) {Goto(current_line,current_col-(n)); cursor_y -= min(cursor_y-1,n);}
/*--------------------------------------------------------------------------*/
/* Access levels */
/*--------------------------------------------------------------------------*/
/*
When adding priv levels, don't forget to change the following files:
MAX_DISP.C
MAX_UED.C
MAX_MISC.C
MAX_SELU.C (don't forget priv_up(), priv_down()!)
MAX_LOG.C
MAX_IN.C
MAX_V.H
SILT.C
*/
#define TWIT -2 /* 0xFFFE */
#define DISGRACE 0x0000
#define LIMITED 0x0001 /**/
#define NORMAL 0x0002
#define WORTHY 0x0003 /**/
#define PRIVIL 0x0004
#define FAVORED 0x0005 /**/
#define EXTRA 0x0006
#define CLERK 0x0007 /**/
#define ASSTSYSOP 0x0008
#define SYSOP 0x000A
#ifdef NUMBER_PRIVS
#define HIDDEN 0x7fff
#else
#define HIDDEN 0x000b
#endif
/***************************************************************************
Structure Definitions
***************************************************************************/
/*--------------------------------------------------------------------------*/
/* Nodelist.Idx */
/* (File is terminated by EOF) */
/*--------------------------------------------------------------------------*/
struct _ndi
{
sword node; /* node number */
sword net; /* net number */
};
/*--------------------------------------------------------------------------*/
/* FIDONET ADDRESS STRUCTURE */
/*--------------------------------------------------------------------------*/
typedef struct _ADDRESS
{
sword Zone;
sword Net;
sword Node;
sword Point;
} ADDR;
/*--------------------------------------------------------------------------*/
/* System?.Bbs structure */
/* Please note that the `_sys' structure should NOT be considered stable. */
/*--------------------------------------------------------------------------*/
struct _sys
{
word ls_caller; /* Used in SYSTEM.BBS only: number of callers */
sword priv; /* Minimum privs required to get to the area */
byte msgpath[40]; /* Path to messages */
byte bbspath[40]; /* Path to BBS/GBS files *or* the barricade file */
byte hlppath[40]; /* Path to the user-help system */
byte uppath[40]; /* Path to the file upload sub-directory */
byte filepath[40]; /* Path to the file download sub-directory */
word attrib; /* Area attribute (see below) */
byte lock; /* */
byte filler; /* Free space for another kludge... */
long quote_pos; /* Position of next usable byte in Quote file */
};
#include "utime.h"
#include "max_u.h" /* USER.BBS structure */
#include "option.h" /* Menu option enumeration */
/* An individual menu option. There are many of these contained in one *
* _menu file, following the _menu data header, optionally with some *
* NULL-terminated strings between each _opt structure, for the argument. */
struct _opt
{
option type; /* What this menu option does... */
word arglen, /* Length of this command's argument, if any */
priv; /* Priv level required to execute this command */
byte areatype,/* If this particular option can only be used if the user *
* is in a certain message-area type. */
lock; /* Bit-field locks for this particular menu option */
word flag; /* See the OFLAG_xxx contants for more info. */
byte name[20];/* The menu option, as it appears to the user. */
byte far *keypoke;/* Auto-keypoke string */
byte kp_len; /* Length of keypoke */
byte rsvd[4]; /* Reserved for future uses */
};
struct _menu
{
word header, /* What to display when the user enters menu, such as *
* "The MESSAGE Section", "The CHG SETUP Section", etc */
num_options, /* Total number of options (struct _opt's) in menu */
menu_length; /* Number of lines long the .?BS menu file is! */
sword hot_colour; /* What colour to display if a user uses hotkeys to *
* bypass a .?BS menu display, before displaying the *
* key. -1 == display nothing. */
word title_len; /* Length of the title string, not counting \0. */
byte *title; /* The name of the menu */
word headfile_len;/* Length of the header filename, not counting \0 */
byte *headfile; /* File to display when first entering menu */
word dspfile_len; /* Length of the dspfile filename, not counting \0. */
byte *dspfile; /* Name of file to display for menu, instead of *
* generating menu from .Mnu file. */
struct _opt *options[NUM_MENU];
byte *arg[NUM_MENU];
byte rsvd[16]; /* Reserved by Maximus for future uses */
};
#define STATS_VER 0 /* Version number of the BBSTATxx.BBS file */
struct _bbs_stats
{
byte version; /* Version number of BBSTATxx.BBS file */
dword num_callers;
dword quote_pos;
dword msgs_written;
time_t online_date;
dword total_dl;
dword total_ul;
};
#include "prm.h" /* MAX.PRM structure */
struct _aidx
{
word area; /* Same format as area.areano */
dword offset;
dword name_crc; /* Currently undefined, but reserved by Maximus. *
* This will probably become a CRC-32 of the *
* area.name string, below... but is currently not *
* implemented. */
};
#ifdef NEVER
/* NOTE: The _area structure has a dynamic length! To access this file, *
* you should read the first _area structure from the file, and *
* check the struct_len byte. Then, to access the file, you seek *
* to each new location, instead of reading straight through. *
* *
* For example, to read all of the _area file into an array, you *
* MUST do it like this, for upward compatiblity: */
{
struct _area area[NUM_AREAS];
int x,
slen;
if ((areafile=open(area_name,O_RDONLY | O_BINARY))==-1)
Error();
/* Read the first record of the file, to grab the structure-length *
* byte. */
read(areafile,&area[0],sizeof(struct _area));
slen=area[0].struct_len;
for (x=0;! eof(area_data);x++)
{
/* Note this lseek() call, which positions the pointer to the *
* start of the next record, no matter how long the previous *
* record was. */
lseek(areafile,x*(long)struct_len,SEEK_SET);
read(areafile,&area[x],sizeof(struct _area));
}
close(areafile);
}
#endif
struct _override
{
int priv; /* Override priv level */
byte lock; /* Override lock setting */
byte ch; /* First letter of menu option to apply override to */
};
#define AREA_id 0x54414441L /* "ADAT" */
struct _area
{
long id; /* Unique identifier for AREA.DAT structure. *
* Should be AREA_id, above. */
word struct_len; /* Length of _area structure -- this needs only *
* to be read from the first record in an area *
* data file, since it can be assumed to remain *
* the same throughout the entire file. This is *
* GUARANTEED to be at offset two for all future *
* versions of this structure. */
word areano; /* This is the integer representation of this *
* area's name, and will be obsoleted very *
* shortly, even though the current version of *
* Maximus uses this internally. Use the 'name' *
* element instead: It is a standard string, and *
* is what will be supported in future versions. *
* One of the items on our "To Do" list is to *
* completely go with area names. This means that *
* we'll be using a string for an area "number", *
* and it could theoretically be as long as could *
* fit in the 'name' variable, as long as it is a *
* single word. ie. "BinkleyTerm" could be a *
* valid area name! By using the 'name' element *
* as a straight ASCII string, you'll have *
* automatic support for future versions of Max. */
byte name[40]; /* String format of area's name. USE THIS! */
/*************************************************************************/
/** Message Area Information **/
/*************************************************************************/
word area_type; /* Message base type. 0x00 = *.MSG. Others are *
* currently undefined, and rsvd by Maximus. */
byte msgpath[80], /* Path to messages */
msgname[40], /* The 'tag' of the area, for use in ECHOTOSS.LOG */
msginfo[80], /* The DIR.BBS-like description for msg section */
msgbar[80], /* Barricade file for message area */
origin[62]; /* The ORIGIN line for this area */
sword msgpriv; /* This is the priv required to access the msg *
* section of this area. */
byte msglock; /* The lock for the message area */
byte fill1;
sword origin_aka; /* This is the AKA number to use on the origin *
* line. See the normal SysOp documentation on *
* the "Origin" statement, for info on how this *
* number is used. */
/*************************************************************************/
/** File Area Information **/
/*************************************************************************/
byte filepath[80], /* Path for downloads */
uppath[80], /* Path for uploads */
filebar[80], /* Barricade file for file areas */
filesbbs[80], /* Path to FILES.BBS-like catalog for this area */
fileinfo[80]; /* The DIR.BBS-like description for file section */
sword filepriv; /* This is the priv required to access the file *
* section of this area. */
byte filelock; /* The locks for the file area */
byte fill2;
/*************************************************************************/
/** Miscellaneous Information **/
/*************************************************************************/
byte msgmenuname[13], /* Alternate *.MNU name to use for this msg.area */
filemenuname[13];/* Alternate *.MNU name to use for this file area */
word attrib[MAXCLASS];/* This is an array of attributes for the *
* msg/file areas. These are dependant on PRIV *
* level. Once you have the CLASS number for a *
* particular user (via Find_Class_Number()), you *
* can find the attributes for that particular *
* priv level like this: "area.attrib[class]" *
* ...which will get you the attribute for that *
* priv level. */
/*************************************************************************/
/** Stuff hacked on later **/
/*************************************************************************/
struct _override movr[MAX_OVR]; /* Override privs for msg/file areas */
struct _override fovr[MAX_OVR];
};
/* ChatFind...() handle. Only used internally. */
struct _cgs
{
int ptr,
num_tid;
int tids[255];
};
/* IPCxx.BBS header structure (see MAX_CHAT.C) */
struct _cstat
{
int avail;
char username[36],
status[80];
int msgs_waiting;
long msg_offset;
int msglen;
};
/* Data element in IPCxx.BBS file (see MAX_CHAT.C) */
struct _cdat
{
int tid,
type,
len;
long prior_offset;
int prior_len;
};
/* Handle for saving CHAT status. Mainly used internally, but also *
* in RESTARxx.BBS. */
struct _css
{
int avail;
char status[80];
};
/* NOTE: The following structure is not completely stable. Unless *
* rst.rst_ver is equal to RST_VER, then the ONLY items you're guaranteed *
* to be able to read are those marked with "*STABLE*". Those items *
* are guaranteed to be stored at those offsets for all future versions *
* of Maximus, regardless of the version number. However, everything *
* else is likely to change at a moment's notice. */
struct _restart
{
char rst_ver; /* Version number of restart data *STABLE* */
long timeon, /* Date user got on system, seconds since 1970 *STABLE* */
timeoff, /* Date user must be OFF system, secs since '70 *STABLE* */
restart_offset; /* Offset in .BBS file to restart at *STABLE* */
unsigned long baud, /* User's baud rate *STABLE* */
max_time; /* Max time, as given by '-t' param *STABLE* */
int port; /* Current COM port, 0=COM1, 1=COM2, *STABLE* */
char written_echomail, /* 0=user HASN'T written echomail *STABLE* */
written_matrix, /* 0=user HASN'T entered matrix msg *STABLE* */
local; /* 0=NOT local *STABLE* */
struct _stamp laston; /* Time the user was last on system *STABLE* */
long starttime, /* Start time, for external protocol */
timestart; /* Time when MAX.EXE was started */
char restart_type, /* 1 if started via .BBS file, 0 otherwise */
restart_name[PATHLEN], /* Name of .BBS file to restart in */
menuname[PATHLEN], /* Name of current menu */
menupath[PATHLEN], /* The current menu path */
firstname[36], /* The user's first name */
next_ldate[19], /* Date to insert in usr.ldate when s/he logs off*/
last_onexit[PATHLEN], /* The 'onexit' filename for current .BBS file*/
parm[PATHLEN], /* Parms for external program, if any */
fix_menupath[PATHLEN], /* Readjust menu name */
last_name[MAX_MENUNAME], /* Name of the last menu */
lastmenu, /* Last ^oR menu choice */
snoop, /* If snoop is currently on or off */
locked, /* If priv is locked via keyboard 'L' command */
locked2, /* If priv locked via barricade */
keyboard, /* If the Sysop's keyboard is turned on */
protocol_letter, /* Letter representing current protocol choice */
chatreq, /* If user wanted to chat with SysOp */
mn_dirty, /* If menuname buf is dirty */
barricade_ok; /* If current barricade area is OK */
int usr_time, /* User's usr.time value */
usernum, /* User's user number */
ultoday, /* Number of k-bytes uploaded today */
lockpriv, /* If rst.locked (above), then this is real priv */
lockpriv2, /* If rst.locked2, then this is real priv */
ctltype; /* Control-file type (for xternal protocol) */
unsigned int current_baud; /* User's baud rate, as a mask for mdm_baud() */
/* Bit flags for ECHOTOSS.LOG */
char echo_written_in[(MAX_AREAS/CHAR_BITS)+1];
struct _area area;
struct _css css;
};
#ifdef DMALLOC
#include "dmalloc.h"
#endif
/* The rest of this junk is from OPUS.H: */
/*--------------------------------------------------------------------------*/
/* The Opus Computer-Based Conversation System */
/* (c) Copyright 1986, Wynn Wagner III, All Rights Reserved */
/* */
/* */
/* YOOHOO is a trademark of Wynn Wagner III */
/* */
/* YOOHOO-YOOHOO/2U2 & WaZOO are */
/* Copyright 1987, Wynn Wagner III, All Rights Reserved */
/* */
/* */
/* */
/* This material is available for use by anybody with no strings and */
/* no guarantees. */
/* */
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/* NodeList.Sys */
/* */
/* NET > 0 and NODE > 0 Normal node */
/* */
/* NET > 0 and NODE <= 0 Host node */
/* Net host........node== 0 */
/* Regional host...node==-1 */
/* Country host....node==-2 */
/* */
/* NET == -1 Nodelist.Sys revision */
/* */
/* NET == -2 Nodelist statement */
/* */
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/* NODE */
/* Please note the NewStyle structure (below). Time is running out for the */
/* existing `_node' structure! Opus currently uses the old style node */
/* structure, but not for long. */
/*--------------------------------------------------------------------------*/
struct _node
{
sword number; /* node number */
sword net; /* net number */
word cost; /* cost of a message to this node */
word rate; /* baud rate */
byte name[20]; /* node name */
byte phone[40]; /* phone number */
byte city[40]; /* city and state */
};
/*--------------------------------------------------------------------------*/
/* THE NEWSTYLE NODE LIST IS NOW BEING USED BY OPUS 1.10 */
/*--------------------------------------------------------------------------*/
struct _newnode
{
word NetNumber;
word NodeNumber;
word Cost; /* cost to user for a
* message */
byte SystemName[34]; /* node name */
byte PhoneNumber[40]; /* phone number */
byte MiscInfo[30]; /* city and state */
byte Password[8]; /* WARNING: not necessarily
* null-terminated */
word RealCost; /* phone company's charge */
word HubNode; /* node # of this node's hub
* or 0 if none */
byte BaudRate; /* baud rate divided by 300 */
byte ModemType; /* RESERVED for modem type */
word NodeFlags; /* set of flags (see below) */
word NodeFiller;
};
/*------------------------------------------------------------------------*/
/* Values for the `NodeFlags' field */
/*------------------------------------------------------------------------*/
#define B_hub 0x0001
#define B_host 0x0002
#define B_region 0x0004
#define B_zone 0x0008
#define B_CM 0x0010
#define B_ores1 0x0020
#define B_ores2 0x0040
#define B_ores3 0x0080
#define B_ores4 0x0100
#define B_ores5 0x0200
#define B_res1 0x0400
#define B_res2 0x0800
#define B_res3 0x1000
#define B_res4 0x2000
#define B_res5 0x4000
#define B_res6 0x8000
#define MAXEXPAND 30 /* max download files (wildcard expansion) */
#define CMDLEN 60 /* size of the command typeahead buffer */
#define CARRYLEN 20 /* LORE editor's carry buffer */
/*--------------------------------------------------------------------------*/
/* The rest of this file contains structure definitions similar to those */
/* used by Fido<tm> version 11w. No claim is made that Opus will maintain */
/* compatibility with these structures beyond Opus version 0. */
/* */
/* The original version of the following items can be found in STRUCT.H, an */
/* include file writte (and probably copyrighted by) Tom Jennings. */
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/* User help levels */
/*--------------------------------------------------------------------------*/
#define EXPERT 0x02 /* grizzled veteran, no menus at all */
#define REGULAR 0x04 /* experienced user, brief menus */
#define NOVICE 0x06 /* Full menus plus additional hand-holding */
#define HOTFLASH 0x20 /* Hotkey, full-screen interface */
/*--------------------------------------------------------------------------*/
/* */
/* MESSAGE AND FILE AREAS */
/* */
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/* Area attributes (limit or describe the behavior of an area) */
/*--------------------------------------------------------------------------*/
#define SYSMAIL 0x0001 /* is a mail area */
#define NOPUBLIC 0x0004 /* OPUS: Disallow public messages */
#define NOPRIVATE 0x0008 /* OPUS: Disallow private messages */
#define ANON_OK 0x0010 /* OPUS: Enable anonymous messages */
#define ECHOMAIL 0x0020 /* OPUS: Set=Echomail Clear=Not Echomail */
#define HIGHBIT 0x0040 /* MAX: Allow high-bit chars in this area */
#define NREALNAME 0x0200 /* MAX: Don't use ^aREALNAME for this area */
#define UREALNAME 0x0400 /* MAX: Use usr.realname instead of usr.name */
/*--------------------------------------------------------------------------*/
/* */
/* MESSAGES */
/* */
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/* Message header */
/*--------------------------------------------------------------------------*/
struct _msg
{
byte from[36];
byte to[36];
byte subj[72];
byte date[20]; /* Obsolete/unused ASCII date information */
word times; /* FIDO<tm>: Number of times read */
sword dest; /* Destination node */
sword orig; /* Origination node number */
word cost; /* Unit cost charged to send the message */
sword orig_net; /* Origination network number */
sword dest_net; /* Destination network number */
/* A TIMESTAMP is a 32-bit integer in the Unix */
/* flavor (ie. the number of seconds since */
/* January 1, 1970). Timestamps in messages are */
/* always Greenwich Mean Time, never local time. */
struct _stamp date_written; /* When user wrote the msg */
struct _stamp date_arrived; /* When msg arrived on-line */
word reply; /* Current msg is a reply to this msg number */
word attr; /* Attribute (behavior) of the message */
word up; /* Next message in the thread */
};
/*--------------------------------------------------------------------------*/
/* Message attributes */
/*--------------------------------------------------------------------------*/
#define MSGPRIVATE 0x0001 /* private message * 0000 0000 0000 0001 */
#define MSGCRASH 0x0002 /* squirtmail * 0000 0000 0000 0010 */
#define MSGREAD 0x0004 /* read by addressee * 0000 0000 0000 0100 */
#define MSGSENT 0x0008 /* sent OK (remote) 0000 0000 0000 1000 */
#define MSGFILE 0x0010 /* file attached to msg * 0000 0000 0001 0000 */
#define MSGFWD 0x0020 /* in transit 0000 0000 0010 0000 */
#define MSGORPHAN 0x0040 /* unknown dest node 0000 0000 0100 0000 */
#define MSGKILL 0x0080 /* kill after bundling * 0000 0000 1000 0000 */
#define MSGLOCAL 0x0100 /* FidoNet vs. local 0000 0001 0000 0000 */
#define MSGHOLD 0x0200 /* Hold, don't send * 0000 0010 0000 0000 */
#define MSGXX2 0x0400 /* <reserved> X? 0000 0100 0000 0000 */
#define MSGFRQ 0x0800 /* file request * 0000 1000 0000 0000 */
#define MSGRRQ 0x1000 /* receipt requested X* 0001 0000 0000 0000 */
#define MSGCPT 0x2000 /* is a return receipt X* 0010 0000 0000 0000 */
#define MSGARQ 0x4000 /* audit trail requested X* 0100 0000 0000 0000 */
#define MSGURQ 0x8000 /* update request X* 1000 0000 0000 0000 */
/*-----------------------*/
/* ^ */
/* | */
/* * = preserved by */
/* the network */
/* ? = stripped by the */
/* net (FTSC spec) */
/* but preserved */
/* by seadog<tm> */
/* X = not used by Opus */
/*-----------------------*/
/*--------------------------------------------------------------------------*/
/* Message bundle header */
/*--------------------------------------------------------------------------*/
#define PKTVER 2 /* Used for `ver' (below) */
/*--------------------------------------------*/
/* POSSIBLE VALUES FOR `product' (below) */
/* */
/* NOTE: These product codes are assigned by */
/* the FidoNet<tm> Technical Stardards Com- */
/* mittee. If you are writing a program that */
/* builds bundles, you will need a product */
/* code. Please use ZERO until you get your */
/* own. For more information on codes, write */
/* to FTSC at 220/1. */
/* */
/*--------------------------------------------*/
#define isFIDO 0 /* Fido<tm>'s product code */
#define isSPARK 1 /* FastScan, Rover, etc */
#define isSEA 2 /* Seadog<tm>'s product code */
#define isOPUS 5 /* Opus<no_tm>'s product code (a PRIME number)*/
#define isHENK 6 /* Dutchie product code */
#define isBRINKERS 7
#define isTABBIE 8
#define isDOUG 9
struct _pkthdr
{
sword orig_node; /* originating node */
sword dest_node; /* destination node */
word year; /* 0..99 when packet was created */
word month; /* 1..12 when packet was created */
word day; /* 1..31 when packet was created */
word hour; /* 0..23 when packet was created */
word minute; /* 0..59 when packet was created */
word second; /* 0..59 when packet was created */
word rate; /* destination's baud rate */
word ver; /* packet version */
sword orig_net; /* originating network number */
sword dest_net; /* destination network number */
byte product; /* product type */
byte rev_level; /* filler (used by some systems) */
/* ------------------------------ */
/* THE FOLLOWING SECTION IS NOT */
/* THE SAME ACROSS SYSTEM LINES: */
/* ------------------------------ */
byte password[8]; /* ONLY 6 CHARS ARE SIGNIFICANT!! */
word qm_orig_zone,
qm_dest_zone;
byte rsvd1[8];
word orig_zone,
dest_zone,
orig_point,
dest_point;
long pr_data;
};
struct _pktprefix
{
word ver;
sword orig_node;
sword dest_node;
sword orig_net;
sword dest_net;
word attr;
word cost;
};
/*
struct star_dot_pkt=
{
struct _pkthdr;
struct
{
struct _pktprefix;
null-terminated (date)
null-terminated (to)
null-terminated (from)
null-terminated (subj)
null-terminated (message!)
};
char null='\x00';
}
*/
#if defined(ORACLE) && defined(__TURBOC__)
/* Turn off warnings for "Unused parameter", "Defined var never used", *
* and "assigned value that is never used", bcuz they make things messy *
* when compiling Oracle. */
#pragma warn -par
#pragma warn -aus
#pragma warn -use
#endif
#endif /* _MAX_H_DEFINED */